VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "ObjRotated"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Option Explicit

Private NumCurvePts As Integer
Private CurvePoints() As Point3D

Private pline As ObjPolyline    ' The display polyline.

' ************************************************
' Add a point to the curve.
' ************************************************
Public Sub AddCurvePoint(x As Single, y As Single, z As Single)
    NumCurvePts = NumCurvePts + 1
    ReDim Preserve CurvePoints(1 To NumCurvePts)
    CurvePoints(NumCurvePts).coord(1) = x
    CurvePoints(NumCurvePts).coord(2) = y
    CurvePoints(NumCurvePts).coord(3) = z
    CurvePoints(NumCurvePts).coord(4) = 1
End Sub

' ************************************************
' Create the display polyline by rotating around
' the Y axis.
' ************************************************
Public Sub Rotate()
Dim i As Integer
Dim r As Single
Dim theta As Single
Dim dtheta As Single
Dim t As Single
Dim x As Single
Dim z As Single
Dim x1 As Single
Dim y1 As Single
Dim z1 As Single
Dim x2 As Single
Dim y2 As Single
Dim z2 As Single

    Set pline = New ObjPolyline
        
    ' Create the translated images of the curve.
    dtheta = PI / 8
    For theta = 0 To 2 * PI - dtheta + 0.01 Step dtheta
        x = CurvePoints(1).coord(1)
        z = CurvePoints(1).coord(3)
        r = Sqr(x * x + z * z)
        t = Arctan2(x, z)
        x1 = r * Cos(t + theta)
        y1 = CurvePoints(1).coord(2)
        z1 = r * Sin(t + theta)
        For i = 2 To NumCurvePts
            x = CurvePoints(i).coord(1)
            z = CurvePoints(i).coord(3)
            r = Sqr(x * x + z * z)
            t = Arctan2(x, z)
            x2 = r * Cos(t + theta)
            y2 = CurvePoints(i).coord(2)
            z2 = r * Sin(t + theta)
            
            pline.AddSegment x1, y1, z1, x2, y2, z2
            x1 = x2
            y1 = y2
            z1 = z2
        Next i
    Next theta

    ' Create the circles of rotation.
    For i = 1 To NumCurvePts
        x = CurvePoints(i).coord(1)
        z = CurvePoints(i).coord(3)
        r = Sqr(x * x + z * z)
        t = Arctan2(x, z)
        x1 = r * Cos(t)
        y1 = CurvePoints(i).coord(2)
        z1 = r * Sin(t)
        For theta = dtheta To 2 * PI - dtheta + 0.01 Step dtheta
            x2 = r * Cos(t + theta)
            z2 = r * Sin(t + theta)
            pline.AddSegment x1, y1, z1, x2, y1, z2
            x1 = x2
            z1 = z2
        Next theta
        x2 = r * Cos(t)
        z2 = r * Sin(t)
        pline.AddSegment x1, y1, z1, x2, y1, z2
    Next i
End Sub

' ***********************************************
' Return a string indicating the object type.
' ***********************************************
Property Get ObjectType() As String
    ObjectType = "ROTATED"
End Property



' ***********************************************
' Fix the data coordinates at their transformed
' values.
' ***********************************************
Public Sub FixPoints()
Dim i As Integer
Dim j As Integer

    ' Fix the curve points.
    For i = 1 To NumCurvePts
        For j = 1 To 3
            CurvePoints(i).coord(j) = CurvePoints(i).trans(j)
        Next j
    Next i

    ' Fix the display polyline if it exists.
    If Not pline Is Nothing Then pline.FixPoints
End Sub

' ************************************************
' Apply a transformation matrix which may not
' contain 0, 0, 0, 1 in the last column to the
' object.
' ************************************************
Public Sub ApplyFull(M() As Single)
Dim i As Integer

    ' Transform the curve.
    For i = 1 To NumCurvePts
        m3ApplyFull CurvePoints(i).coord, M, _
                    CurvePoints(i).trans
    Next i
    
    ' Transform the display polyline if it exists.
    If Not pline Is Nothing Then pline.ApplyFull M
End Sub

' ************************************************
' Apply a transformation matrix to the object.
' ************************************************
Public Sub Apply(M() As Single)
Dim i As Integer

    ' Transform the curve.
    For i = 1 To NumCurvePts
        m3Apply CurvePoints(i).coord, M, _
                CurvePoints(i).trans
    Next i
    
    ' Transform the display polyline if it exists.
    If Not pline Is Nothing Then pline.Apply M
End Sub


' ************************************************
' Apply a nonlinear transformation.
' ************************************************
Public Sub Distort(D As Object)
Dim i As Integer

    ' Distort the curve.
    For i = 1 To NumCurvePts
        D.Distort CurvePoints(i).coord(1), _
                  CurvePoints(i).coord(2), _
                  CurvePoints(i).coord(3)
    Next i
    
    ' Distort the display polyline if it exists.
    If Not pline Is Nothing Then pline.Distort D
End Sub


' ************************************************
' Write the surface's display polyline object to a
' file using Write. The data can later be loaded
' into an ObjPolyline object but not an
' ObjRotated object.
' ************************************************
Public Sub FileWritePolyline(filenum As Integer)
    If Not pline Is Nothing Then pline.FileWrite filenum
End Sub


' ************************************************
' Write an extruded surface to a file using Write.
' Begin with "ROTATED" to identify this object.
' ************************************************
Public Sub FileWrite(filenum As Integer)
Dim i As Integer

    ' Write basic information.
    Write #filenum, "ROTATED", NumCurvePts
        
    ' Write the curve points.
    For i = 1 To NumCurvePts
        Write #filenum, _
            CurvePoints(i).coord(1), _
            CurvePoints(i).coord(2), _
            CurvePoints(i).coord(3)
    Next i
End Sub




' ************************************************
' Draw the extrusion on a Form, Printer, or
' PictureBox.
' ************************************************
Public Sub Draw(canvas As Object, Optional r As Variant)
    If Not pline Is Nothing Then _
        pline.Draw canvas, r
End Sub


' ************************************************
' Read a grid from a file using Input.
' Assume the "ROTATED" label has already been
' read.
' ************************************************
Public Sub FileInput(filenum As Integer)
Dim i As Integer

    ' Get the basic information.
    Input #filenum, NumCurvePts
    
    ' Allocate the curve array.
    ReDim CurvePoints(1 To NumCurvePts)
    
    ' Read the curve points.
    For i = 1 To NumCurvePts
        Input #filenum, _
            CurvePoints(i).coord(1), _
            CurvePoints(i).coord(2), _
            CurvePoints(i).coord(3)
        CurvePoints(i).coord(4) = 1
    Next i
    
    ' Create the display polyline.
    Rotate
End Sub


